﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Cheb2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            textBox2.Text = "4";
            textBox3.Text = "4";
            textBox4.Text = "3";
            textBox5.Text = "1e-8";
            textBox6.Text = "200";
        }

        public double uu(double x, double y)
        {
            return Math.Exp(1 - x * x - y * y);
        }
        public double funk(double x, double y)
        {
            return 4.0 * uu(x, y) * (x * x + y * y - 1);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            int n;
            int.TryParse(textBox2.Text, out n);
            int m;
            int.TryParse(textBox3.Text, out m);
            int l;
            int.TryParse(textBox4.Text, out l);
            double ee;
            double.TryParse(textBox5.Text,out ee);
            int s;
            int.TryParse(textBox6.Text, out s);

            double h = 1.0 / n;
            double k = 1.0 / m;

            //заполнение вспомогательных массивов
            double[,] u = new double[2 * n + 1, 2 * m + 1];
            double[,] b = new double[2 * n + 1, 2 * m + 1];
            for (int p = 0; p <= 2*n; p++)
                for (int j = 0; j <= 2*m; j++)
                    b[p,j] = funk(-1 +p*h,-1+j*k);
            for (int i = 1; i < 2 * n; i++)
                u[i, 0] = uu(-1 + i * h, -1);
            for (int i = 1; i < 2 * m; i++)
                u[0, i] = uu(-1, -1 + i * k);
            for (int i = 1; i < n; i++)
                u[i, 2 * m] = uu(-1 + i * h, 1);
            for (int i = n; i < 2 * m; i++)
                u[i, m] = uu(-1 + i * h, 0);
            for (int i = 1; i < m; i++)
                u[2 * n, i] = uu(1, -1 + i * k);
            for (int i = m + 1; i < 2 * m; i++)
                u[n, i] = uu(0, -1 + i * k);
            // заполнение границ завершено

            ChebMethod met = new ChebMethod(l, n, h, m, k, b, u);
            int count = 0;
            double ereal = 0;
            int Imax = 1;
            int Jmax = 1;
            count = met.method(ee,out ereal, s, Imax, Jmax);

            //оценка точности решения
            Imax = 1;
            Jmax = 1;
            for (int i = 1; i < 2*n; i++)
            {
                for (int j = 1; j < m; j++)
                {
                    if (Math.Abs(uu(-1 + i * h, -1 + j * k) - met.u[i, j]) > Math.Abs(uu(-1 + Imax * h, -1 + Jmax * k) - met.u[Imax, Jmax]))
                    {
                        Imax = i;
                        Jmax = j;
                    }
                }
            }

            for (int i = 1; i < n; i++)
            {
                for (int j = m; j < 2 * m; j++)
                {
                    if (Math.Abs(uu(-1 + i * h, -1 + j * k) - met.u[i, j]) > Math.Abs(uu(-1 + Imax * h, -1 + Jmax * k) - met.u[Imax, Jmax]))
                    {
                        Imax = i;
                        Jmax = j;
                    }
                }
            }

            //

            textBox1.Text = count.ToString() + Environment.NewLine + ereal.ToString()
                + Environment.NewLine + Math.Abs(uu(-1 + Imax * h, -1 + Jmax * k) - met.u[Imax, Jmax]).ToString();
        }
    }
}
